function [BEF3,BEP3,BestCost3]=IDMO(nPop,MaxIt,VarMin,VarMax,nVar,fobj)
    
%% 初始化
%初始化算法参数
%Dim=30;             % 维度
VarSize=[1 nVar];   % 变量矩阵尺寸
%VarMin=-100;         % 最小值
%VarMax= 100;         % 最大值

%初始化猫鼬种群
%MaxIt=500;              % 最大迭代次数
%nPop=30;               % 种群规模
nBabysitter= 3;         % 保姆数量
nAlphaGroup=nPop-nBabysitter;        % 阿尔法组数量
nScout=nAlphaGroup;         % 侦察组数量
L=round(0.6*nVar*nBabysitter); %保姆交换条件
peep=2;             % 阿尔法组发声参数 
% 建立初始种群空矩阵
empty_mongoose.Position=[];
empty_mongoose.Cost=[];
pop=repmat(empty_mongoose,nAlphaGroup,1);%把初始矩阵扩充为27*1矩阵

Xbest1=[]; 
Xbest2=[];
Xbest3=[];
Xmean=[];
% 初始最优解
BestSol.Cost=inf;
tau=inf;
sm=inf(nAlphaGroup,1);%睡眠丘
BestCost=zeros(MaxIt,1);%存储最优值
C=zeros(nAlphaGroup,1);%时间计数器
Iter=1;%迭代次数

% 创建初始种群
for i=1:nAlphaGroup
    pop(i).Position=unifrnd(VarMin,VarMax,VarSize);%生成1*27的随机矩阵
    pop(i).Cost=fobj(pop(i).Position);
    if pop(i).Cost<=BestSol.Cost
        BestSol=pop(i);
    end
end

%% DMOA 主循环

for Iter=1:MaxIt
    % 阿尔法组        
    k=(1+(3*Iter/MaxIt)^0.5)^8; %反向学习参数
    
    for i=1:nAlphaGroup
        % 计算适应度值选择阿尔法组雌性首领
        Lenspop(i).Position=(VarMin+VarMax)/2+(VarMin+VarMax)/(2*k)-pop(i).Position/k;%引入透镜成像反向学习
        pop(i).Cost=fobj(pop(i).Position);
        Lenspop(i).Cost=fobj(Lenspop(i).Position);
        if Lenspop(i).Cost<pop(i).Cost
            pop(i).Cost=Lenspop(i).Cost;
            pop(i).Position=Lenspop(i).Position;
        end
        if pop(i).Cost<=BestSol.Cost
        BestSol=pop(i);
        end
    end
    %计算适应度值 
     F=zeros(nAlphaGroup,1);%适应度
     MeanCost = mean([pop.Cost]);%适应度均值
    for i=1:nAlphaGroup
        % 计算适应度值选择阿尔法组雌性首领
        F(i) = exp(-pop(i).Cost/MeanCost); % 归一化适应度，适应度权重越大，值越小
    end
        P=F/sum(F);%计算每个雌性个体成为首领的概率   
        
 %%%%%%%%%%%%%%%%%%%%%%%%%%基于精英池开始觅食
    [Sortpop,index]=sort([pop.Cost]);%将种群按适应度值升序排列
    Xelite(1,:)=pop(index(1)).Position; 
    Xelite(2,:)=pop(index(2)).Position;
    Xelite(3,:)=pop(index(3)).Position; %当前适应度值最优三个个体
    %[Dsortpop,dindex]=sort([pop.Cost],'descend');%将种群按适应度值降序排列
    
    for i=1:1:nAlphaGroup/2
    omega(i)= log(nAlphaGroup/2+0.5)-log(i);
    end
    sumw=sum(omega);
    for i=1:1:nAlphaGroup/2
    omega(i)= omega(i)/sumw;
    Xmean(i,:) =omega(i)*pop(index(i)).Position;
    end
    Xelite(4,:)=sum(Xmean);
   
     for m=1:nAlphaGroup       
        i=RouletteWheelSelection(P);        % 轮盘赌挑选雌性首领      
        K=[1:i-1 i+1:nAlphaGroup];
        k=K(randi([1 numel(K)])); % 选取不同于雌性首领的随机个体       
        phi=(peep/2)*unifrnd(-1,+1,VarSize);     % 定义发声系数？
        if m<nAlphaGroup/2
            newpop.Position=Xelite(randi(4),:)+phi.*(pop(i).Position-pop(k).Position);
        else
            newpop.Position=pop(i).Position+phi.*(pop(i).Position-pop(k).Position);      % 食物侯选位置？
        end
        newpop.Cost=fobj(newpop.Position);  % 评估新适应度     
        if newpop.Cost<=pop(i).Cost  %比较新种群和原种群
            pop(i)=newpop;
        else
            C(i)=C(i)+1;   %时间计数器加一
        end      
    end   
    
    % 侦察组
    for i=1:nScout     %开始觅食       
        K=[1:i-1 i+1:nAlphaGroup];
        k=K(randi([1 numel(K)]));
        phi=(peep/2)*unifrnd(-1,+1,VarSize);
        if m<nAlphaGroup/2
            newpop.Position=Xelite(randi(4),:)+phi.*(pop.Position(i,:)-pop.Position(k,:));
        else
           newpop.Position=pop(i).Position+phi.*(pop(i).Position-pop(k).Position);
        end
        newpop.Cost=fobj(newpop.Position);
        
        %睡眠丘
        sm(i)=(newpop.Cost-pop(i).Cost)/max(newpop.Cost,pop(i).Cost);
        if newpop.Cost<=pop(i).Cost
            pop(i)=newpop;
        else
            C(i)=C(i)+1;
        end       
    end   
    
    % 保姆组
    for i=1:nBabysitter
        %是否满足保姆交换条件，若满足，初始化个体，并计算适应度
        if C(i)>=L   
            pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
            pop(i).Cost=fobj(pop(i).Position);
            C(i)=0;
        end
    end    
     % 更新每代最优解
    for i=1:nAlphaGroup
        if pop(i).Cost<=BestSol.Cost
            BestSol=pop(i);
        end
    end    
        
   % 新种群位置
   newtau=mean(sm);
   CF=(1-Iter/MaxIt)^(2*Iter/MaxIt);%移动能力参数
   for i=1:nScout
        M=(pop(i).Position.*sm(i))/pop(i).Position;%方向向量
        if newtau>tau
           newpop.Position=pop(i).Position-CF*phi*rand.*(pop(i).Position-M);
        else
           newpop.Position=pop(i).Position+CF*phi*rand.*(pop(i).Position-M);
        end
        tau=newtau;
   end     
 % 更新每代最优解
    for i=1:nAlphaGroup
        if pop(i).Cost<=BestSol.Cost
            BestSol=pop(i);
        end
    end

    % 存储最优个体
    BestCost3(Iter)=BestSol.Cost;
    BEF3=BestSol.Cost;
    BEP3=BestSol.Position;
    % Display Iteration Information
    %disp(['Iteration ' num2str(Iter) ': Best Cost = ' num2str(IBestCost(Iter))]);
end
